const fs = require('fs')
module.exports = async function uploader (ctx, next) {
    console.log('中间件')
    // 拿前端传来的数据：是一些大数据
    if (ctx.req.headers['content-type'].indexOf('form-data') >= 0) {
        // content-type为form-data的时候才走本中间件
        let boundary = '--' + ctx.request.headers['content-type'].split(';')[1].split('=')[1]
        let buf = Buffer.alloc(0)
        let bSize = Buffer.byteLength(boundary) // 分割线的字节长度
        let bufIndexArr = [] // 所有buf的下标
        let bufData = []
        await new Promise((resolve, reject) => {
            ctx.req.on('data', (chunk) => {
                buf = Buffer.concat([buf, chunk])
            })
            ctx.req.on('end', _ => {
                fs.writeFileSync('./a.txt', buf)
                // 根据分隔符去拆分数据
                // 所有buf的下标
                let index = -1
                do {
                    let offset = 0
                    if (bufIndexArr.length > 0) {
                        // 第二次及以后才能走进来
                        offset = bufIndexArr[bufIndexArr.length - 1] + bSize
                    }
                    index = buf.indexOf(boundary, offset)
                    if (index > -1) {
                        bufIndexArr.push(index)
                    }
                } while (index !== -1)
                // 截取数据
                for (let i = 0; i < bufIndexArr.length; i++) {
                    let temp = buf.slice(bufIndexArr[i] + bSize, bufIndexArr[i + 1])
                    if (temp.toString() != '--\r\n') {
                        bufData.push(temp)
                    }
                }
                bufData = bufData.map((item) => {
                    item = item.toString().split('\r\n\r\n')
                    console.log('截取了', item[0])
                    if (item[0].indexOf('Content-Type: image/') !== -1) {
                        // 代表此项为图片
                        console.log('图片')
                        let key = item[0].split(';')[1].split('=')[1]
                        let filename = item[0].split(';')[2].split('=')[1]
                        let imgBuf = item[1].trim()
                        // 存文件
                        fs.writeFileSync(path.join(__dirname, filename.replace(/"/g, '')), imgBuf)
                        return {
                            key,
                            filename
                        }
                    } else {
                        let key = item[0].trim().split(';')[1].split('=')[1]
                        // console.log(key)
                        let value = item[1].trim()
                        return {
                            key,
                            value
                        }
                    }
                })
                console.log('bufData', bufData)
                ctx.bufData = bufData
                resolve()
            })
        })
        await next()
    } else {
        await next()
    }
}